//package org.example.ecsp.audit.service.impl;
//
//import cn.tedu.mivos.application.mapper.ApplicationMapper;
//import cn.tedu.mivos.application.pojo.entity.Application;
//import cn.tedu.mivos.audit.mapper.AuditMapper;
//import cn.tedu.mivos.audit.pojo.dto.AuditQuery;
//import cn.tedu.mivos.audit.pojo.dto.AuditSaveParam;
//import cn.tedu.mivos.audit.pojo.entity.Audit;
//import cn.tedu.mivos.audit.pojo.vo.AuditVO;
//import cn.tedu.mivos.audit.service.AuditService;
//import cn.tedu.mivos.enums.ApplicationStatusEnum;
//import cn.tedu.mivos.enums.AuditStatusEnum;
//import cn.tedu.mivos.user.mapper.UserMapper;
//import cn.tedu.mivos.user.pojo.vo.UserVO;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.StringJoiner;
//
//@Slf4j
//@Service
///*注解用于标记一个方法或类，使其在执行时自动开启数据库事务。如果方法执行成功，则提交事务；
//如果方法执行过程中抛出异常，则回滚事务。这确保了数据库操作的原子性和一致性。*/
//@Transactional
//public class AuditServiceImpl implements AuditService {
//@Autowired
//     AuditMapper auditMapper;
//@Autowired
//UserMapper userMapper;
//@Autowired
//ApplicationMapper applicationMapper;
//
//     @Override
//     public void insertAudit(Application application) {
//          log.debug("开始处理新增审批单的请求，参数：{}", application);
//          List<Long> userIdList = application.getAuditUserIdList();
//          for (int i = 0; i < userIdList.size(); i++){
//               Audit audit = new Audit();
//               audit.setApplicationId(application.getId());
//               audit.setAuditUserId(userIdList.get(i));
//               audit.setAuditSort(i);
//               if (i == 0){
//                    audit.setAuditStatus(AuditStatusEnum.MY_PENDING.getCode());
//               }else {
//                    audit.setAuditStatus(AuditStatusEnum.PENDING.getCode());
//               }
//               audit.setCreateTime(new Date());
//               auditMapper.insert(audit);
//          }
//     }
//
//     @Override
//     public List<AuditVO> selectAuditByApplicationId(Long id) {
//          return auditMapper.selectAuditByApplicationId(id);
//     }
//
//     @Override
//     public List<AuditVO> selectAudit(AuditQuery auditQuery) {
//          log.debug("开始处理查询审批单的业务，参数：{}", auditQuery);
//          List<AuditVO> auditVOList = auditMapper.selectAudit(auditQuery);
//          //遍历每一个审批对象,依次为每一个审批对象补充审批人姓名
//          for(int i=0;i<auditVOList.size();i++){
//               AuditVO auditVO = auditVOList.get(i);
//               assignAuditUserList(auditVO);
//          }
//          return auditVOList;
//     }
//
//
//     private void assignAuditUserList(AuditVO auditVO) {
//          ArrayList<String> auditUsernameList = new ArrayList<>();
//          ArrayList<Long> auditUserIdList = new ArrayList<>();
//          List<AuditVO> auditVOList = auditMapper.selectAuditByApplicationId(auditVO.getApplicationId());
//          //遍历每一个审批单对象,获取当前审批单中的审批人id与姓名
//          for (int i = 0; i < auditVOList.size(); i++){
//               Long userId = auditVOList.get(i).getAuditUserId();
//               auditUserIdList.add(userId);
//               UserVO user=userMapper.selectById(userId);
//               auditUsernameList.add(user.getUsername());
//          }
//          StringJoiner stringJoiner = new StringJoiner(",");
//          for (String username : auditUsernameList) {
//               stringJoiner.add(username);
//          }
//          auditVO.setAuditUsernameList(stringJoiner.toString());
//          auditVO.setAuditUserIdList(auditUserIdList);
//    }
//     @Override
//     public void updateAudit(AuditSaveParam auditSaveParam) {
//          log.debug("开始处理更新审批单数据的业务，参数：{}", auditSaveParam);
//          Audit audit=new Audit();
//          BeanUtils.copyProperties(auditSaveParam,audit);
//          audit.setUpdateTime(new Date());
//          //准备当前审批对应的申请单对象
//          Application application=new Application();
//          application.setId(audit.getApplicationId());
//          application.setUpdateTime(new Date());
//          //需要判断当前要做的处理是 通过处理还是驳回处理
//          if (audit.getAuditStatus().equals(AuditStatusEnum.AUDITED.getCode())){//审批通过
//               //更新当前的审批单数据
//               auditMapper.update(audit);
//               /*继续查是否还有其他的审批单:其他审批单与当前审批单对应的申请单是同一个*/
//               AuditQuery auditQuery=new AuditQuery();
//               auditQuery.setApplicationId(audit.getApplicationId());
//               //根据申请单id查询当前对应的所有未审批的审批单总数, 注意:当前的审批单已审批通过了
//               Integer count = auditMapper.selectRestAuditCount(auditQuery);
//               if (count>0){//还有未审批的审批单
//                    //下一条审批数据是当前审批单数据的次序+1
//                    auditQuery.setAuditSort(audit.getAuditSort()+1);
//                    //再根据申请单id与审批单的次序,查出当前审批单之后的下一条审批单
//                    List<AuditVO> auditVOList = auditMapper.selectAudit(auditQuery);
//                    if (auditVOList!=null && auditVOList.size()>0){
//                         AuditVO auditVO = auditVOList.get(0);//取出下一条审批单
//                         //创建一个新的Audit对象,代表第二个审批单对象
//                         Audit audit2=new Audit();
//                         audit2.setId(auditVO.getId());//将刚刚取出来的审批单id赋值给新的audit2对象
//                         //设置当前第 2 条审批单状态为"待我审批",并更新
//                         audit2.setAuditStatus(AuditStatusEnum.MY_PENDING.getCode());
//                         auditMapper.update(audit2);
//                    }
//                    //设置申请单的状态为"审核中"
//                    application.setStatus(ApplicationStatusEnum.AUDIT.getCode());
//                    applicationMapper.update(application);
//               }else {//没有未审核的审批单
//                    application.setStatus(ApplicationStatusEnum.AUDITED.getCode());
//                    applicationMapper.update(application);
//               }
//          }else {//审批驳回
//               //更新当前的审批单
//               auditMapper.update(audit);
//               /*查询此申请单对应的审批单有没有"待他人审核"的数据?  有就删除*/
//               AuditQuery auditQuery=new AuditQuery();
//               auditQuery.setApplicationId(audit.getApplicationId());
//               List<AuditVO> auditVOList = auditMapper.selectAudit(auditQuery);
//               //判断是否查到了审批单列表
//               if (auditVOList!=null && auditVOList.size()>0){//有待审批的审批单
//                    for (int i = 0;i < auditVOList.size();i++){
//                         AuditVO auditVO = auditVOList.get(i);
//                         //判断当前审批单状态是否为"待他人审批" 有就删除该审批单
//                         if (auditVO.getAuditStatus().equals(AuditStatusEnum.PENDING.getCode())){
//                              auditMapper.deleteById(auditVO.getId());
//                         }
//                    }
//               }//没有未审批的审批单
//               //更新当前申请单状态为"已驳回"并设置为驳回原因
//               application.setStatus(ApplicationStatusEnum.REJECT.getCode());
//               application.setRejectReason(auditSaveParam.getRejectReason());
//               applicationMapper.update(application);
//          }
//     }
//
//}